package com.qf.im.service.impl;

import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.extra.pinyin.PinyinUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qf.im.base.Codes;
import com.qf.im.dao.UserDao;
import com.qf.im.entity.User;
import com.qf.im.exception.ServiceException;
import com.qf.im.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 用户表(User)表服务实现类
 *
 * @author makejava
 * @since 2023-10-25 10:20:37
 */
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {

    /**
     * 重写save方法，重新定义用户的注册业务
     * @param entity
     * @return
     */
    @Override
    public boolean save(User entity) {
        //判断用户名是否存在
        User user = this.query()
                .eq("username", entity.getUsername()).one();
        if (user != null) {
            //用户名已经存在
            throw new ServiceException(Codes.USER_EXISTS);
        }

        //通过邮箱查询数据库
        user = this.query().eq("email", entity.getEmail()).one();
        if (user != null) {
            //邮箱已经存在
            throw new ServiceException(Codes.EMAIL_EXISTS);
        }

        //原文 -> 加密 -> 密文（32位）
        //密码加密 - MD5
        String md5Pass = DigestUtil.md5Hex(entity.getPassword());
        entity.setPassword(md5Pass);

        //将昵称转换成拼音
        entity.setNickpinyin(PinyinUtil.getPinyin(entity.getNickname(), ""));

        //保存到数据库
        return super.save(entity);
    }

    /**
     * 登录的业务
     * @param username
     * @param password
     * @return
     */
    @Override
    public User login(String username, String password) {
        User user = this.query()
                .eq("username", username)
                .eq("password", DigestUtil.md5Hex(password))
                .one();

        if (user == null) {
            throw new ServiceException(Codes.AUTH_ERROR);
        }
        return user;
    }


    /**
     * 根据用户名查询用户信息
     * @param username
     * @return
     */
    @Override
    public User queryUserInfo(String username) {
        User user = this.query().eq("username", username).one();
        if (user == null) {
            throw new ServiceException(Codes.USER_NOT_FOUND);
        }

        return user;
    }

    /**
     * 搜索用户
     * @param keyword
     * @return
     */
    @Override
    public List<User> searchUser(String keyword) {

        if (!StringUtils.hasLength(keyword)){
            return null;
        }

        List<User> users = this.query()
                .like("username", keyword)
                .or()
                .like("nickname", keyword)
                .or()
                .like("nickpinyin", keyword)
                .list();

        return users;
    }
}

